home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Collection of Tools & Utilities
/
Collection of Tools and Utilities.iso
/
ada
/
gwuada_6.zip
/
BLOCK.C
< prev
next >
Wrap
C/C++ Source or Header
|
1993-08-21
|
7KB
|
214 lines
/*
GWAda Development Environment for 386/486 PCs
Copyright (C) 1993, Arthur Vargas Lopes & Michael Bliss Feldman
vlopes@vortex.ufrgs.br mfeldman@seas.gwu.edu
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/* block.c */
#include <externs.h>
void AVL_PROCESS_COPY()
{
AVL_EDIT_COPY(1);
}
void AVL_REMOVE_BLOCK()
{
;
}
void AVL_EDIT_COPY(int no)
{
AVL_EDIT_WINDOW_PTR w;
AVL_LINE_PTR temp, temp2, temp3;
struct rccoord old;
char new_line[(AVL_MAX_LINEL*2+10)];
char save[AVL_MAX_LINEL + 2];
int i, j, k;
if ((avl_block_first_line == NULL) ||
(avl_block_last_line == NULL)) {
AVL_ERROR("Block was not marked");
return;
}
avl_block_first_line2 =
avl_block_last_line2 = NULL;
w = &avl_windows[avl_window];
temp = w -> current_line;
if (w -> txt_col > (k = strlen(temp -> line)))
AVL_CURSOR_END();
for(i = 0; i < w -> txt_col; ++i) /* Make first line of block */
new_line[i] = temp -> line[i];
for(j = avl_block_first_col; avl_block_first_line -> line[j] != '\0'; ++j) {
new_line[i++] = avl_block_first_line -> line[j];
if (avl_block_first_line == avl_block_last_line)
if (j == avl_block_last_col)
break;
}
/* First line will now be completed */
if (w -> txt_col != k)
strcpy(save,&temp -> line[w -> txt_col]);
else
strcpy(save,"");
w -> changed = 1;
if (avl_block_first_line == avl_block_last_line) { /* Done */
for(j = w -> txt_col; temp -> line[j] != '\0'; ++j)
new_line[i++] = temp -> line[j];
new_line[i++] = '\0';
if (i >= AVL_MAX_LINEL)
AVL_ERROR("Block's first line too long. Will truncate!");
new_line[AVL_MAX_LINEL] = '\0';
strcpy(temp -> line,new_line);
AVL_UPDATE_LINE();
return;
}
new_line[i++] = '\0';
if (i >= AVL_MAX_LINEL)
AVL_ERROR("Block's first line too long. Will truncate!");
new_line[AVL_MAX_LINEL] = '\0';
strcpy(temp -> line,new_line);
AVL_UPDATE_LINE();
/* There is more than one line */
temp2 = temp;
for(temp = avl_block_first_line -> next;
temp -> previous != avl_block_last_line;
temp = temp -> next) {
temp3 = AVL_MAKE_LINE(temp -> line, 1);
AVL_LINK(temp3,temp2);
temp2 = temp3;
}
for(i = 0; i < avl_block_last_col; ++i)
new_line[i] = temp3 -> line[i];
new_line[i++] = '\0';
strcat(new_line,save);
if (strlen(new_line) >= AVL_MAX_LINEL) {
AVL_ERROR("Last block's line too long. Will truncate!");
new_line[AVL_MAX_LINEL] = '\0';
}
strcpy(temp3 -> line, new_line);
i = w -> scr_row;
j = w -> scr_col;
w -> scr_col = 1;
AVL_MAKE_NUMBER();
temp3 = w -> current_line;
for(temp = w -> current_line -> next; ++(w -> scr_row) <= 24 && temp != w -> head;
temp = temp -> next) {
_settextposition(w -> scr_row,1);
w -> current_line = temp;
AVL_UPDATE_LINE();
}
w -> current_line = temp3;
w -> scr_row = i;
w -> scr_col = j;
_settextposition(i,j);
}
void AVL_CLEAR_BLOCK()
{
AVL_LINE_PTR t1, t2;
avl_message[0] = '\0';
if (avl_block_first_line == NULL ||
avl_block_last_line == NULL) return;
for(t1 = avl_block_first_line; t1 != avl_block_last_line; t1 = t2) {
t2 = t1 -> next;
free(t1);
}
free(t1);
avl_block_first_line2 =
avl_block_last_line2 = NULL;
avl_block_first_line = NULL;
avl_block_last_line = NULL;
}
void AVL_LINK(AVL_LINE_PTR this,AVL_LINE_PTR at)
{
this -> previous = at;
this -> next = at -> next;
at -> next -> previous = this;
at -> next = this;
}
void AVL_MAKE_BLOCK()
{
AVL_LINE_PTR t1, t2, t3, temp;
int i, j;
if (avl_block_first_line -> line_no > avl_block_last_line -> line_no) { /* Swap */
temp = avl_block_first_line;
avl_block_first_line = avl_block_first_line2 = avl_block_last_line;
avl_block_last_line = avl_block_last_line2 = temp;
i = avl_block_first_col;
avl_block_first_col = avl_block_first_col2 = avl_block_last_col;
avl_block_last_col = i;
avl_block_last_col2 = i;
}
if (avl_block_first_line == avl_block_last_line)
if (avl_block_last_col < avl_block_first_col) { /* Swap only cols */
i = avl_block_first_col;
avl_block_first_col = avl_block_first_col2 = avl_block_last_col;
avl_block_last_col = avl_block_last_col2 = i;
}
t1 = AVL_MAKE_LINE(avl_block_first_line -> line,1);
t1 -> next = t1 -> previous = t1;
if (avl_block_first_line == avl_block_last_line) {
avl_block_first_line = t1;
avl_block_last_line = t1;
return;
}
temp = avl_block_first_line -> next;
avl_block_first_line = t1;
for(; temp -> previous != avl_block_last_line;
temp = temp -> next) {
t2 = AVL_MAKE_LINE(temp -> line,1);
AVL_LINK(t2,t1);
t1 = t2;
}
avl_block_last_line = t1;
}
void AVL_GUIDE_MBLOCK()
{
if ((avl_block_first_line != NULL) && (avl_block_last_line != NULL))
AVL_CLEAR_BLOCK();
if (avl_block_first_line == NULL) {
avl_block_first_line = avl_windows[avl_window].current_line;
if (avl_block_first_line -> line_no == 0)
avl_windows[avl_window].current_line =
avl_block_first_line = avl_block_first_line -> next;
avl_block_first_col = avl_windows[avl_window].txt_col;
avl_block_first_line2 = avl_windows[avl_window].current_line;
avl_block_first_col2 = avl_windows[avl_window].txt_col;
strcpy(avl_message,"Now mark the block's end");
AVL_UPDATE_STATUS_LINE();
}
else {
avl_block_last_line = avl_windows[avl_window].current_line;
if (avl_block_last_line -> line_no == 0)
avl_windows[avl_window].current_line =
avl_block_last_line = avl_block_last_line -> previous;
avl_block_last_col = avl_windows[avl_window].txt_col;
avl_block_last_line2 = avl_windows[avl_window].current_line;
avl_block_last_col2 = avl_windows[avl_window].txt_col;
strcpy(avl_message,"Block marked");
AVL_UPDATE_STATUS_LINE();
AVL_MAKE_BLOCK();
}
}